﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace TestPlatform.Core.Impl
{
    internal class TexRenderer : IResultRenderer
    {
        public void Render(TestResult result)
        {
            List<int> instances = result.Result.FirstOrDefault().Value.Keys.ToList();
            StringBuilder sb = new StringBuilder();
            string operationType = result.Result.FirstOrDefault().Key.OperationType;

            sb.AppendFormat(@"\begin{{table}}");
            sb.Append("\n");
            sb.AppendFormat(@"\begin{{tabular}}{{ | l | {0} | }}", result.Result.Select(r => " l ").Aggregate((acc, c) => string.Format("{0} | {1}", acc, c)));
            sb.Append("\n");
            sb.AppendFormat(@"\hline  & {0} \\", result.Result.Select(r => r.Key.UnderlyinEngine).Aggregate((acc, c) => string.Format("{0} & {1}", acc, c)));
            sb.Append("\n");

            foreach (var instanceSize in instances)
            {
                sb.AppendFormat(@"\hline Operacji: {0} & {1} \\", instanceSize, result.Result.Select(r => FormatTimespan(r.Value[instanceSize])).Aggregate((acc, c) => string.Format("{0} & {1}", acc, c)));
                sb.AppendLine();
            }

            sb.AppendFormat(@"\hline");
            sb.Append("\n");
            sb.AppendFormat(@"\end{{tabular}}");
            sb.Append("\n");
            sb.AppendFormat(@"\caption{{ Czasy wykonania operacji \textit{{{0}}} dla poszczególnych baz danych }}", operationType);
            sb.Append("\n");
            sb.AppendFormat(@"\label{{table_{0}}}", operationType);
            sb.Append("\n");
            sb.AppendFormat(@"\end{{table}}");
            sb.Append("\n");


            File.WriteAllText(string.Format(@"..\..\..\..\{0}__.tex", operationType), sb.ToString());
        }

        public string FormatTimespan(TimeSpan ts)
        {
            return string.Format("{0}s {1}ms",
                (int)ts.TotalSeconds,
                ts.Milliseconds);
        }


        //   \begin{center}
        //    \begin{tabular}{ | l | p{6cm} | p{6cm} |}
        //    \hline
        //    Metoda/Zasób & \url{http://localhost/collection} & \url{http://localhost/collection/11} \\ 
        //    \hline
        //    GET & Pobranie całej kolekcji obiektów typu \textit{collection} & Pobranie pojedynczego elementu kolekcji, identyfikowanego przez klucz \textit{11} \\
        //    \hline
        //    PUT & Nadpisanie kolekcji \textit{collection} przez nową & Nadpisanie pojedynczego elementu o identyfikatorze \textit{11} nowym \\
        //    \hline
        //    POST & Stworzenie nowego elementu w kolekcji \textit{collection} & Stworzenie nowego wpisu w elemencie o identyfikatorze \textit{11} \\
        //    \hline
        //    DELETE & Usunięcie całej kolekcji \textit{collection} & Usunięcie elementu o identyfikatorze \textit{11} z kolekcji \textit{collection} \\
        //    \hline
        //    \end{tabular}
        //\end{center}
    }
}
